nv.http.ScriptNode = function (url) {
    nv.util.OOP.extend(this, nv.http.Base, url, 'GET');
    var $this = this;
    $this.JSCallbackParameterName = 'jscallback';
    $this._Send = function (params) {
        var extraParams = {};
        if ($this.DataType != nv.http.DataTypes.JSON) {
            extraParams.format = 'jscallbackex';
        } else {
            extraParams.format = 'jscallback';
            $this.TriggerSuccess = function (data) {
                $this.OnSuccess.Trigger(data);
            };
        }
        var onReady = function () {
            var timeoutTimer = null;
            var unique_callback_name = $this.WrapCallbackAsGlobal(function (data) {
                window[unique_callback_name] = function () {};
                clearTimeout(timeoutTimer);
                $this.TriggerSuccess(data);
            });
            extraParams[$this.JSCallbackParameterName] = unique_callback_name;
            timeoutTimer = setTimeout(function () {
                window[unique_callback_name] = function (data) {};
                $this.TriggerFailure("timeout");
            }, $this.Timeout);
            var data = $this.GetQueryString(extraParams);
            if (typeof params != 'undefined') {
                var paramsQueryString = $this.GetQueryString(params);
                if (paramsQueryString) {
                    data = paramsQueryString + '&' + data;
                }
            }
            var scriptNode = document.createElement("SCRIPT");
            scriptNode.type = "text/javascript";
            scriptNode.src = url + (data ? "?" + data : "");
            nv.util.Dom.safeAddNodeToHead(scriptNode);
        };
        if (!document.body) {
            var checkTimer = setInterval(function () {
                if (document.body) {
                    clearInterval(checkTimer);
                    onReady();
                }
            }, 500);
        } else {
            onReady();
        }
    };
};